home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / fortune.c < prev    next >
C/C++ Source or Header  |  1990-07-23  |  2KB  |  90 lines

  1. /*  fortune  -  hand out Chinese fortune cookies    Author: Bert Reuling */
  2.  
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <time.h>
  6. #include <stdio.h>
  7.  
  8. #define COOKIEJAR "/usr/lib/fortune.dat"
  9.  
  10. static char *Copyright = "\0fortune v1.1 Copyright (c) 1988 Bert Reuling";
  11.  
  12. long seed;
  13.  
  14. main(argc, argv)
  15. int argc;
  16. char *argv[];
  17. {
  18.   int c1, c2, c3;
  19.   long magic();
  20.   struct stat cookie_stat;
  21.   FILE *cookie, *out, *fopen(), *popen();
  22.  
  23.   if ((cookie = fopen(COOKIEJAR, "r")) == NULL) {
  24.     fprintf(stderr, "%s:\nCan't open %s\n", argv[0], COOKIEJAR);
  25.     exit(-1);
  26.   }
  27.  
  28.   /* Create seed from : date, time, user-id and process-id we can't get
  29.    * the position of the moon, unfortunately.
  30.    */
  31.   seed = time((time_t *) 0) * (long) (getuid() + 1) * (long) getpid();
  32.  
  33.   if (stat(COOKIEJAR, &cookie_stat) != 0) {
  34.     fprintf(stderr, "%s:\nCannot stat cookie jar\n", argv[0]);
  35.     exit(-1);
  36.   }
  37.   fseek(cookie, magic((long) cookie_stat.st_size), 0);    /* move by magic... */
  38.  
  39.   c2 = c3 = '\n';
  40.   while (((c1 = getc(cookie)) != EOF) && ((c1 != '%') || (c2 != '%') || (c3 != '\n'))) {
  41.     c3 = c2;
  42.     c2 = c1;
  43.   }
  44.  
  45.   if (c1 == EOF) {
  46.     fprintf(stderr, "%s:\n", argv[0]);
  47.     fprintf(stderr, "The cookie jar does not have a bottom!\n");
  48.     fprintf(stderr, "All cookies have fallen out...\n");
  49.     exit(-1);
  50.   }
  51. #ifdef FORMATTER
  52.   if ((out = popen(FORMATTER, "w")) == NULL) {
  53.     fprintf(stderr, "%s:\nIt furthers one to see a plumber!\n", argv[0]);
  54.     exit(-1);
  55.   }
  56. #else
  57.   out = stdout;
  58. #endif
  59.  
  60.   c2 = c3 = '\n';
  61.   while (((c1 = getc(cookie)) != '%') || (c2 != '%') || (c3 != '\n')) {
  62.     if (c1 == EOF) {
  63.         rewind(cookie);
  64.         continue;
  65.     }
  66.     putc(c2, out);
  67.     c3 = c2;
  68.     c2 = c1;
  69.   }
  70.   putc('\n', out);
  71.   fclose(cookie);
  72.  
  73. #ifdef FORMATTER
  74.   pclose(out);
  75. #endif
  76.  
  77.   exit(0);
  78. }
  79.  
  80. /*  magic  -  please study carefull: there is more than meets the eye */
  81. long magic(range)
  82. long range;
  83. {
  84.   int i;
  85.  
  86.   for (i = 0; i < 1234; i++)
  87.     seed = 883L * (seed % 881L) - 2 * (seed / 883L) + 1L;
  88.   return((long) ((int) (seed & 0x7fffL) * range / 0x7fffL));
  89. }
  90.